1 module hip.loaders.fonts; 2 import hip.filesystem.hipfs; 3 import hip.asset_manager.load_task; 4 import hip.assetmanager; 5 import hip.api.data.commons; 6 import hip.font.bmfont; 7 import hip.font.ttf; 8 import hip.assets.texture; 9 10 11 12 final class HipTTFFontLoadTask : HipAssetLoadTask 13 { 14 private HipFSPromise fs; 15 int fontSize; 16 HipFont font; 17 private ubyte[] rawImage; 18 19 this(string path, string name, HipAsset asset, int fontSize, const(ubyte)[] extraData ,string fileRequesting, size_t lineRequesting) 20 { 21 super(path, name, asset, extraData, fileRequesting, lineRequesting); 22 this.fontSize = fontSize; 23 } 24 25 override void update() 26 { 27 final switch(result) with (HipAssetResult) 28 { 29 case waiting: 30 result = loading; 31 worker = HipAssetManager.loadWorker("Load and Decode TTF Font", () 32 { 33 HipFS.read(path) 34 .addOnError((string err){error = err; result = cantLoad;}) 35 .addOnSuccess((in ubyte[] data) 36 { 37 Hip_TTF_Font ttFont = new Hip_TTF_Font(path, fontSize); 38 font = ttFont; 39 if(!ttFont.partialLoad(data, rawImage)) 40 { 41 result = cantLoad; error = "Could not load TTF data"; 42 return FileReadResult.free; 43 } 44 result = mainThreadLoading; 45 return FileReadResult.free; 46 }); 47 }); 48 break; 49 case loading: 50 break; 51 case mainThreadLoading: 52 Hip_TTF_Font ttFont = cast(Hip_TTF_Font)font; 53 if(!ttFont.loadTexture(rawImage)) 54 { 55 result = cantLoad; error = "Failed loading texture for TTF Font"; 56 return; 57 } 58 asset = ttFont; 59 result = loaded; 60 break; 61 case cantLoad: goto case loaded; 62 case loaded: 63 break; 64 } 65 } 66 67 } 68 69 70 final class HipBMFontLoadTask : HipAssetLoadTask 71 { 72 private HipFSPromise fs; 73 int fontSize; 74 HipBitmapFont font; 75 IImage loadedImage; 76 77 this(string path, string name, HipAsset asset, int fontSize, const(ubyte)[] extraData, string fileRequesting, size_t lineRequesting) 78 { 79 super(path, name, asset, extraData, fileRequesting, lineRequesting); 80 this.fontSize = fontSize; 81 } 82 83 override void update() 84 { 85 final switch(result) with (HipAssetResult) 86 { 87 case waiting: 88 result = loading; 89 worker = HipAssetManager.loadWorker("Load and Decode BMFont", () 90 { 91 HipFS.read(path) 92 .addOnError((string err){error = err; result = cantLoad;}) 93 .addOnSuccess((in ubyte[] data) 94 { 95 font = new HipBitmapFont(); 96 if(!font.loadAtlas(cast(string)data, path)) 97 { 98 result = cantLoad; error = "Could not load BMFont data"; 99 return FileReadResult.free; 100 } 101 HipFS.read(font.getTexturePath) 102 .addOnError((string err){ result = cantLoad; error = err; }) 103 .addOnSuccess((in ubyte[] imgData) 104 { 105 new Image(font.getTexturePath(), imgData, (IImage img) 106 { 107 result = mainThreadLoading; 108 loadedImage = img; 109 }, (){result = cantLoad; error = "Failed to load image data"; }); 110 return FileReadResult.free; 111 }); 112 return FileReadResult.free; 113 }); 114 }); 115 break; 116 case loading: 117 break; 118 case mainThreadLoading: 119 120 if(!font.loadTexture(new HipTexture(loadedImage, HipResourceUsage.Immutable))) 121 { 122 result = cantLoad; error = "Failed loading texture for TTF Font"; 123 return; 124 } 125 asset = font; 126 result = loaded; 127 break; 128 case cantLoad: goto case loaded; 129 case loaded: 130 break; 131 } 132 } 133 134 }